/**
 * 功能: 金额工具类
 * @author Conan
 * @CreatedTime 2020-06-17
 */

// 金额单位基数枚举
const unitEnum = {
  P: 1, // 1分(penny) === 1分
  Y: 100, // 1元 === 100分
  W: 1000000, // 1万元 === 1000000分
  M: 100000000 // 1百万元 === 100000000分
}

class AmountUtils {
  /**
   * 功能: 金额单位转换
   * @desc:
   * @parame fromUnit: 当前单位;  toUnit: 转换单位; amount: 金额; scale: 保留位数(默认两位)
   *    fromCurrency: 当前汇率; toCurrency: 转换汇率  ===> 暂不考虑
   * 金额单位转换规则:
   *  1. 将传进来的 金额(amount) 转成最小单位 (分)
   *  2. 再将最小单位的金额 转成 需要输出的 金额单位(toUnit)
   *  3. 进来的必须是数字
   */
  static unitTransfer(amount, fromUnit = 'Y', toUnit = 'W', scale = 2) {
    if (isEmpty(amount) || amount === 0 || amount === '0' || !isNumber(amount)) {
      return '0.00'
    }
    amount = Number(amount)
    const baseUnitNum = unitEnum[fromUnit] // 最小金额基数;
    const miniUnitAmount = amount * baseUnitNum // 计算出最小单位 金额
    const outputUnitNum = unitEnum[toUnit] // 输入单位基数
    const resultAmount = miniUnitAmount / outputUnitNum
    return resultAmount.toFixed(scale)
  }

  /**
   * 功能: 金额加千位符
   * @parame: num: 金额
   * @desc:
   * 1. 将传进来的 金额 转成 带有千位符的 金额
   */
  static toThousands(num) {
    if (!num) return '0.00'
    const info = parseFloat(num).toFixed(2).toString().split('.')
    num = info[0]
    let result = ''
    while (num.length > 3) {
      result = ',' + num.slice(-3) + result
      num = num.slice(0, num.length - 3)
    }
    if (num) { result = num + result }
    info[0] = result
    return info.join('.')
  }

  /**
   * 功能: 金额 转 中文大写金额
   * @parame: money: 金额
   * @desc:
   * 1. 将 传进来的金额 转成 中文金额
   */
  static parseChina(money) {
    // 汉字的数字
    var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖')
    // 基本单位
    var cnIntRadice = new Array('', '拾', '佰', '仟')
    // 对应整数部分扩展单位
    var cnIntUnits = new Array('', '万', '亿', '兆')
    // 对应小数部分单位
    var cnDecUnits = new Array('角', '分', '厘', '毫')
    // 整数金额时后面跟的字符
    var cnInteger = '整'
    // 整型完以后的单位
    var cnIntLast = '元' // 圆 | 元
    // 最大处理的数字
    var maxNum = 999999999999999.9999
    // 金额整数部分
    var integerNum
    // 金额小数部分
    var decimalNum
    // 输出的中文金额字符串
    var chineseStr = ''
    // 分离金额后用的数组，预定义
    var parts
    if (money === '') { return '' }
    money = parseFloat(money)
    if (money >= maxNum) {
      // 超出最大处理数字
      return ''
    }
    if (money === 0 || money === '0') {
      chineseStr = cnNums[0] + cnIntLast + cnInteger
      return chineseStr
    }
    // 转换为字符串
    money = money.toString()
    if (money.indexOf('.') === -1) {
      integerNum = money
      decimalNum = ''
    } else {
      parts = money.split('.')
      integerNum = parts[0]
      decimalNum = parts[1].substr(0, 4)
    }
    // 获取整型部分转换
    if (parseInt(integerNum, 10) > 0) {
      var zeroCount = 0
      var IntLen = integerNum.length
      for (var i = 0; i < IntLen; i++) {
        var n = integerNum.substr(i, 1)
        var p = IntLen - i - 1
        var q = p / 4
        var m = p % 4
        if (n === '0' || n === 0) {
          zeroCount++
        } else {
          if (zeroCount > 0) {
            chineseStr += cnNums[0]
          }
          // 归零
          zeroCount = 0
          chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
        }
        if (m === 0 && m === '0' && zeroCount < 4) {
          chineseStr += cnIntUnits[q]
        }
      }
      chineseStr += cnIntLast
    }
    // 小数部分
    if (decimalNum !== '') {
      var decLen = decimalNum.length
      for (var i = 0; i < decLen; i++) {
        var n = decimalNum.substr(i, 1)
        if (n !== '0' || n !== 0) {
          chineseStr += cnNums[Number(n)] + cnDecUnits[i]
        }
      }
    }
    if (chineseStr === '') {
      chineseStr += cnNums[0] + cnIntLast + cnInteger
    } else if (decimalNum === '') {
      chineseStr += cnInteger
    }
    return chineseStr
  }
}

export default AmountUtils


/**
 * 功能: 是否数字
 * @parame:
 * @desc:
 */
 function isNumber(val) {
  var regPos = /^\d+(\.\d+)?$/ // 非负浮点数
  var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/ // 负浮点数
  if (regPos.test(val) || regNeg.test(val)) {
    return true
  } else {
    return false
  }
}

/**
 * 功能: 是否为空
 * @parame:
 * @desc:
 */
function isEmpty(obj) {
  if (typeof (obj) === 'undefined' || obj === null || obj === 'null' || obj === 'undefined' || (typeof (obj) === 'string' && obj === '')) {
    return true
  }
  return false
}